
//2799.统计完全子数组的数目
class Solution {
public:
    int countCompleteSubarrays(vector<int>& nums) {
        //题目要求子数组中不同元素的数目等于数组中不同元素的数目
        //这就意味着子数组中包含nums所有种类的数字至少一个
        //还是找恰好满足条件的情况

        //向统计nums中存在多少个不同的元素
        unordered_map<int,int> count;
        for(auto e:nums) count[e]++;
        int differ=count.size();
        
        //进行滑动窗口
        unordered_map<int,int> mm;
        int n=nums.size();
        int ret=0,left=0;
        for(int right=0;right<n;right++)
        {
            mm[nums[right]]++;   //入窗口
            while(mm.size()==differ)
            {
                if(--mm[nums[left]]==0) mm.erase(nums[left]);  //出窗口
                left++;         
            }
            
            ret+=left;  //更新答案
        }
        return ret;
    }
};